جزوه · انتقال ورودی و خروجی فرمان ← بازگشت به فهرست
📘 فصل اول · قسمت پانزدهم انتقال ورودی و خروجی فرمان
📅 تاریخ: ۱۸ مرداد ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian

▍ مقدمه

در لینوکس، هر فرمان سه جریان داده (Stream) اصلی دارد:

🔑 مفهوم اصلی:

با استفاده از عملگرهای انتقال (Redirection Operators) می‌توانیم این جریان‌ها را به جای صفحه کلید/نمایش، به فایل‌ها هدایت کنیم.

▍ عملگرهای انتقال خروجی (STDOUT)

> (بازنویسی خروجی)

عملکرد: خروجی استاندارد (STDOUT) را به یک فایل هدایت می‌کند.

  • اگر فایل وجود داشته باشد، محتوای قبلی آن پاک می‌شود.
  • اگر فایل وجود نداشته باشد، آن را ایجاد می‌کند.
┌──(ya3in㉿kali)-[~] └─$ echo "Hello" > output.txt

متن "Hello" را در فایل output.txt ذخیره می‌کند.

>> (افزودن به انتهای فایل)

عملکرد: خروجی استاندارد را به انتهای یک فایل اضافه می‌کند.

  • اگر فایل وجود داشته باشد، خروجی را به انتهای آن اضافه می‌کند.
  • اگر فایل وجود نداشته باشد، آن را ایجاد می‌کند.
┌──(ya3in㉿kali)-[~] └─$ echo "World" >> output.txt

متن "World" را به انتهای فایل output.txt اضافه می‌کند.

▍ انتقال خطاها (STDERR)

2> (بازنویسی خطاها)

عملکرد: خطاهای استاندارد (STDERR) را به یک فایل هدایت می‌کند.

  • اگر فایل وجود داشته باشد، محتوای قبلی آن پاک می‌شود.
  • اگر فایل وجود نداشته باشد، آن را ایجاد می‌کند.
┌──(ya3in㉿kali)-[~] └─$ ls /nonexistent 2> error.log

خطای "No such file or directory" را در فایل error.log ذخیره می‌کند.

2>> (افزودن خطاها)

عملکرد: خطاهای استاندارد را به انتهای یک فایل اضافه می‌کند.

  • اگر فایل وجود داشته باشد، خطاها را به انتهای آن اضافه می‌کند.
  • اگر فایل وجود نداشته باشد، آن را ایجاد می‌کند.
┌──(ya3in㉿kali)-[~] └─$ ls /fake 2>> error.log

خطا را به انتهای فایل error.log اضافه می‌کند.

▍ انتقال همزمان خروجی و خطا

&> (همه چیز)

عملکرد: هر دو جریان STDOUT و STDERR را به یک فایل هدایت می‌کند.

  • اگر فایل وجود داشته باشد، محتوای قبلی آن پاک می‌شود.
  • اگر فایل وجود نداشته باشد، آن را ایجاد می‌کند.
┌──(ya3in㉿kali)-[~] └─$ ls /home /nonexistent &> all_output.txt

هم خروجی و هم خطا را در فایل all_output.txt ذخیره می‌کند.

&>> (افزودن همه چیز)

عملکرد: هر دو جریان STDOUT و STDERR را به انتهای یک فایل اضافه می‌کند.

  • اگر فایل وجود داشته باشد، خروجی و خطا را به انتهای آن اضافه می‌کند.
  • اگر فایل وجود نداشته باشد، آن را ایجاد می‌کند.
┌──(ya3in㉿kali)-[~] └─$ ls /tmp /fake &>> all_output.txt

خروجی و خطا را به انتهای فایل all_output.txt اضافه می‌کند.

▍ انتقال ورودی (STDIN)

< (ورودی از فایل)

عملکرد: ورودی استاندارد (STDIN) را از یک فایل می‌خواند.

┌──(ya3in㉿kali)-[~] └─$ cat < input.txt

محتوای فایل input.txt را به عنوان ورودی به cat می‌دهد.

<> (ورودی و خروجی)

عملکرد: ورودی را از یک فایل می‌خواند و خروجی را به همان فایل هدایت می‌کند.

┌──(ya3in㉿kali)-[~] └─$ command <> file.txt

از file.txt ورودی می‌خواند و خروجی را به همان فایل می‌نویسد.

⚠️ نکته:

این عملگر کمتر استفاده می‌شود و معمولاً با دستورات خاصی کار می‌کند که نیاز به خواندن و نوشتن همزمان در یک فایل دارند.

▍ جدول خلاصه عملگرها

عملگر توضیح مثال
> بازنویسی STDOUT در فایل echo "text" > file.txt
>> افزودن STDOUT به انتهای فایل echo "text" >> file.txt
2> بازنویسی STDERR در فایل ls /fake 2> error.log
2>> افزودن STDERR به انتهای فایل ls /fake 2>> error.log
&> بازنویسی STDOUT + STDERR ls /home /fake &> all.log
&>> افزودن STDOUT + STDERR ls /home /fake &>> all.log
< ورودی از فایل cat < input.txt
<> ورودی و خروجی از یک فایل cmd <> file.txt

▍ نکات مهم و ترکیبی

📌 دور ریختن خروجی (به سیاهچاله):
┌──(ya3in㉿kali)-[~] └─$ command > /dev/null 2>&1

توضیح: همه خروجی‌ها (STDOUT و STDERR) را به /dev/null (سیاهچاله) می‌فرستد.

💡 ترکیب با پایپ (Pipe):

انتقال (Redirection) با | (پایپ) فرق دارد:

  • پایپ (|): خروجی یک دستور را به عنوان ورودی دستور بعدی می‌دهد.
  • انتقال (>): خروجی را به فایل می‌فرستد.
┌──(ya3in㉿kali)-[~] └─$ ls -la | grep ".txt" > result.txt

ابتدا فایل‌های .txt را با grep پیدا می‌کند، سپس خروجی را در result.txt ذخیره می‌کند.

✅ جمع‌بندی سریع:
  • > ← بازنویسی خروجی
  • >> ← افزودن به انتهای خروجی
  • 2> ← بازنویسی خطاها
  • 2>> ← افزودن به انتهای خطاها
  • &> ← بازنویسی خروجی و خطا
  • &>> ← افزودن خروجی و خطا
  • < ← ورودی از فایل
  • <> ← ورودی و خروجی از یک فایل